function fn(num) {
    return new Promise((reslove,reject) => {
        setTimeout(() => {
            reslove(num * 2)
        },1000)
    })
}

function *gen(num){
    let num1 = yield fn(num)
    console.log(num1);
    let num2 = yield fn(num1)
    console.log(num2);
}

function generatorToAsync(genFn){
    // 返回一个新的函数
    return function (){
        // generator函数也可能传参
        let gen = genFn.apply(this,arguments)
        // 返回一个promise对象
        return new Promise((reslove,reject) => {
            function go(key,arg){
                let res 
                try {
                    // 如果没有出现错误，执行generator函数的next方法
                    res = gen[key](arg)
                } catch (err) {
                    // 出现错误就返回错误reject结果
                    return reject(err)
                }
                // 赋值结构出next方法的value,done
                const {value,done} = res
                // 如果没有下一个就程序执行完毕，返回OK
                if(done) reslove('ok')
                // 没有执行完，递归执行
                else {
                    Promise.resolve(value).then(data => go(key,data))
                }
            }
            // 初始化执行一次
            go('next')
        })
    }
}
generatorToAsync(gen)(1).then(console.log)